/**	@file disegno.h
 *	Questo è un header file che contiene i protitipi delle funzioni definite in disegno.cc.
 */
 
/*
 * Macro per non ripetere il codice più volte
 */

#ifndef _DISEGNO_H_
#define _DISEGNO_H_

#include "models.h"
#include"globali.h"


/** Disegna il drago nella posizione corrente, aggiornata ogni volta. 
 * Disegna il drago, l'immagine predefinita per quel movimento:
 * Spara a destra, Spara a sinistra, Fermo, Muovi a destra o a sinistra
 */
void disegna_drago(Drago &drago);
/** Muove l'indice per lo spostamento del drago.
 * Muove l'indice che gestisce il range di immagini dedicate allo
 * spostamento verso sinistra
 */
void muovi_drago_sx(Drago &drago);
/** Muove l'indice per lo spostamento del drago.
 * Muove l'indice che gestisce il range di immagini dedicate allo
 * spostamento verso destra
 */
void muovi_drago_dx(Drago &drago);

/** Disegna ogni bolla presente sullo schermo nella posizione aggiornata.
 * Ogni bolla se viva viene ridisegnata nella posizione aggiornata dello schermo.
 */
void disegna_bolle(Bolle bolle[], int dim);

/** Rende vivo un oggetto di tipo 
 * Viene eseguita per ogni bolla nuova sparata dal drago. Trova un posto vuoto
 * all'interno dell'array bolle[] , e dichiara quella bolla, prima morta, viva e definisce
 * la sua posizione iniziale sopra la testa del drago.
 */
void spara_bolle(Bolle bolle[], int dim, Drago &drago);

/** Modifica la y delle bolle vive, decrementandola.
 * Viene decrementato il valore delle bolle vive di tanti pixel quanto 
 * e' specificato nella velocità,  che è un campo di ::Bolle
 */
void update_bolle(Bolle bolle[], int dim);


/** Disegna i robot nella posizione aggiornata.
 * Esegue un ciclo e per ogni robot vivo, richiama una funzione di allegro
 * che disegna l'immagine del robot nella posizione corretta e aggiornata.
 */
void disegna_robot(Robot robot[], int dim);

/** Fa nascere un nuovo Robot.
 * Se sulla finestra di gioco non si è raggiunto il ::NUM_ROBOTS massimo, 
 * viene impostato a vivo il campo di quel robot e generata una x a "random
 * nel range della ::WIDTH. E' possibile che due o più robot risultino sovrapposti.
 */
void inizializza_partenza_robot(Robot robot[], int dim);

/** Aggiorna la posizione dei robot e anche le Sprite del robot, rispettado il ritardo impostato.
 * Viene aggiornata la posizione, gestita la sequenza di immagini e anche la velocità, che aumente ogni 
 * 2'000 punti. Se il punteggio cala anche la velocità calerà.
 */
void update_robot(Robot robot[], int dim);

/** Disegna la frutta/dolce nella posizione corretta e aggiornata.
 * Per ogni frutto dell'array frutta[] viene disegnato sulla finestra di gioco
 * il frutto/dolce nella posizione corretta e aggiornata.
 */
void disegna_frutta(Frutta frutta[], int dim);

/** Per ogni frutto non vivo viene generata un partenza "random".
 * Scorre l'array ::Frutta, se è presente un posto dove il frutto è morto, viene generata
 * una posizione "randomizzata" se va a buon fine la condizione if(rand() % 300 == 0).
 */
void inizializza_partenza_frutta(Frutta frutta[], int dim);

/** Per ogni frutto/dolce vivo ne aggiorna la posizione.
 * Viene aggiornata la posizione di ogni frutto/dolce ancora in vita, incrementando la sua y
 * pari a un numero di pixel uguale alla sua velocità.
 */
void update_frutta(Frutta frutta[], int dim);

/** Aggiorna la posizione dello sfondo.
 * Aggiorna la posizione dellos fondo per rendere l'effetto di scorrimento. 
 * In base ai parametri che vengono passati alla funzione lo sfondo scorre più o meno velocemente,
 * verso l'alto o verso il basso e/o verso destra o verso sinistra.
 */
void update_sfondo(Sfondo &sfondo);

/** Viene disegnato lo sfondo nella posizione aggiornata.
 * Lo sfondo viene disegnato nella posizione aggiornata. Nel caso in cui la x o la y
 * si spostino oltre la dimensione corretta, vengono ripristinate alla posizione iniziale.
 */
void disegna_sfondo(Sfondo &sfondo);
#endif
